Spring AOP @Before、@Around、@After等执行顺序

我们都知道,Spring AOP中常用的拦截注解有@Before,@Around,@After。

那么问题来了,你知道他们的执行顺序是怎样的吗?恐怕这个问题还是有很多同学回答不上来,没关系,阅读完本文你就知道啦。

先上结论:

一个方法只被一个Aspect类拦截

在一个方法只被一个aspect类拦截时,aspect类内部的advice将按照以下的顺序进行执行:

正常流程

image

异常流程

注意,这里的图有误,执行完method触发异常之后,是转到After去执行

image

同一个方法被多个Aspect类拦截

这种情况下,aspect1aspect2的执行顺序是未知的。

为了指定每个aspect的执行顺序,可以使用两种方法:

  • 实现org.springframework.core.Ordered接口,实现它的getOrder()方法
  • aspect添加@Order注解,该注解全称为:org.springframework.core.annotation.Order

不管采用上面的哪种方法,都是值越小的aspect越先执行。

image

【注意】

如果在同一个aspect类中,针对同一个pointcut,定义了两个相同的advice(比如,定义了两个@Before),那么这两个advice的执行顺序是无法确定的,哪怕你给这两个advice添加了@Order这个注解,也不行。这点切记。

Spring AOP @Before @Around @After 等 advice 的执行顺序